/*
 * 百度在线网络技术（北京）有限公司拥有本软件版权2021并保留所有权利。
 * Copyright 2021, Baidu.com,Inc 2:Baidu Online Network Technology (Beijing) Co.,Ltd,
 * All rights reserved.
 */

package com.azdebugit.factory.bean.test;

import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * 动态代理，需要注意的是，这里用到的是JDK自带的动态代理，代理对象只能是接口，不能是类
 * @author lichuang
 */
 
public class ServiceProxy<T> implements InvocationHandler {
 
    private Class<T> interfaceType;
 
    public ServiceProxy(Class<T> intefaceType) {
        this.interfaceType = interfaceType;
    }
 
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if (Object.class.equals(method.getDeclaringClass())) {
            return method.invoke(this,args);
        }
        Annotation[] annotations1=  method.getDeclaredAnnotations();
        for (Annotation annotation : annotations1) {
            System.out.println("方法注解："+annotation.toString());
        }
        Annotation[][] annotations= method.getParameterAnnotations();
        for (int i = 0; i < annotations.length; i++) {
            System.out.println("-------------------------"+args[i].toString());
            for (Annotation annotation1 : annotations[i]) {
                System.out.println("参数注解："+ annotation1.toString());
            }
        }
        System.out.println("调用前，参数：{}" + Arrays.toString(args));
        //这里可以得到参数数组和方法等，可以通过反射，注解等，进行结果集的处理
        //mybatis就是在这里获取参数和相关注解，然后根据返回值类型，进行结果集的转换
        Object result ="77777777777777777777777777777777";
        System.out.println("调用后，结果：{}" + result);
        return result;
    }
}
